#include "../socket.hpp"
#include <fstream>
#include <assert.h>
#include <signal.h>
#include <unistd.h>

bool readFile(const std::string &filename, std::string &buf)
{
    std::ifstream ifs(filename, std::ios::binary);
    if (!ifs.is_open())
    {
        LOG(ERR, "open %s file failed", filename.c_str());
        exit(-1);
    }
    ifs.seekg(0, ifs.end);
    int fsize = ifs.tellg();
    ifs.seekg(0, ifs.beg);
    buf.resize(fsize);
    ifs.read(&buf[0], fsize);
    if (!ifs.good())
    {
        LOG(ERR, "read %s file failed", filename.c_str());
        return false;
    }
    ifs.close();
    return true;
}

//test1
// int main()
// {
//     Socket sock;
//     sock.createClient("127.0.0.1", 8080);
//     std::string req_str = "GET /echo HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 100\r\n\r\nmzx19990805";
//     while (true)
//     {
//         /*
//         因为第一次发送时请求正文不足100字节 所以后续发送的两次请求内容 服务器都会将其作为第一个请求的正文 直到长度超过100
//         那么服务器对100字节之后的内容进行解析时大概率会解析失败 因为第二个请求可能被当作第一个请求的正文取走一节 已经不完整了
//         也就是说服务器的发送缓冲区存放了一条完整响应后 继续解析第二个请求时出错 缓冲区又存放一条错误页面响应
//         所以客户端读取数据时同时收到了两条响应
//         */
//         assert(sock.Send(req_str.c_str(), req_str.size()) != -1);
//         assert(sock.Send(req_str.c_str(), req_str.size()) != -1);
//         assert(sock.Send(req_str.c_str(), req_str.size()) != -1);
//         char buf[1024] = {0};
//         //按照当前的请求内容来看 在第三次发送后 服务器才会接收到一条完整请求 所以客户端会在第三次发送之后才能收到服务器的响应
//         assert(sock.Recv(buf, 1023) > 0);
//         LOG(DEG, "[%s]", buf);
//         sleep(20);
//     }
//     sock.Close();
// }

//test2
// int main()
// {
//     signal(SIGCHLD, SIG_IGN);
//     for (int i = 0; i < 10; i++)
//     {
//         pid_t pid = fork();
//         if (pid == -1)
//         {
//             LOG(ERR, "FORK ERROR");
//             exit(-1);
//         }
//         if (pid == 0)//子进程
//         {
//             Socket sock;
//             sock.createClient("127.0.0.1", 8080);
//             while (true)
//             {
                
//                 std::string req_str = "GET /echo HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//                 assert(sock.Send(req_str.c_str(), req_str.size()) != -1);
//                 char buf[1024] = {0};
//                 assert(sock.Recv(buf, 1023) > 0);
//                 LOG(DEG, "[%s]", buf);
//             }
//             sock.Close();
//             exit(-1);
//         }
//     }
//     while (true)
//         sleep(3);
// }

//test3
// int main()
// {
//     Socket sock;
//     sock.createClient("127.0.0.1", 8080);
//     std::string req_str = "GET /echo HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     req_str += "GET /echo HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     req_str += "GET /echo HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     assert(sock.Send(req_str.c_str(), req_str.size()) != -1);
//     char buf[1024] = {0};
//     assert(sock.Recv(buf, 1023) > 0);
//     LOG(DEG, "[%s]", buf);
//     sock.Close();
// }

//test4
int main()
{
    Socket sock;
    sock.createClient("127.0.0.1", 8080);
    std::string req_str = "PUT /123.txt HTTP/1.1\r\nConnection: keep-alive\r\n";
    std::string body;
    readFile("./hello.txt", body);
    req_str += "Content-Length: " + std::to_string(body.size()) + "\r\n\r\n";
    assert(sock.Send(req_str.c_str(), req_str.size()) != -1);
    assert(sock.Send(body.c_str(), body.size()) != -1);//客户端上传大文件时 服务器需要多次触发读事件 调用非常多次handleRead才能取完body
    char buf[1024] = {0};
    assert(sock.Recv(buf, 1023) > 0);
    LOG(DEG, "[%s]", buf);
    sleep(15);
    sock.Close();
}